<?php

/**
 * 公共类
 * @package  htdocs
 * @subpackage  module/base
 * @version 1.0
 */
class commHandler {

    private $dbca;

    public function __construct( $dbca=null ) {
        if (!is_null($dbca))
            $this->dbca = $dbca;
    }

    /**
     * 生成流水号
     * @param string $name 流水号名称
     * @param null|string $prefix 前缀
     * @return null|string
     */
    public function generate_seqno($name, $prefix=null) {

        $seq_no = null;
        $seq_no_ge = null;

        if ($this->dbca->stmt_query('UPDATE sys_seqno SET seqno = seqno + 1 WHERE name = ?', 's', $name)){
            $seq_no = $this->dbca->stmt_query('SELECT seqno FROM sys_seqno WHERE name = ?', 's', $name);
            if (!is_null($seq_no)) {
                $seq_no = $seq_no[0]->seqno;
            }
        }

        if (is_null($seq_no))
            return null;

        switch ($name) {
            case 'seqno_bill':
            case 'seqno_bill_goods':
            case 'seqno_log':
            case 'seqno_alipaylife_log':
            case 'seqno_alipaylife_request_log':
                $seq_no_ge = date('Ymd') . str_repeat('0',10 - strlen($seq_no)) . $seq_no;
                break;
            default:
                $seq_no_ge = $seq_no;
                break;
        }
        if (!is_null($prefix))
            $seq_no_ge = $prefix . $seq_no_ge;

        return $seq_no_ge;

    }

    /**
     * 获得数据表最大的排序序号
     * @param string $table_name 表名
     * @param string $sort_field 排序序号字段名，默认为sortOrder
     * @return int
     */
    public function getSortNum( $table_name, $sort_field = 'sortOrder' ) {

        if (!isset($table_name) || empty($table_name)) {
            return 0;
        }

        try {

            //查询最大排序序号
            $search_sql = sprintf('SELECT IF(MAX(%s) IS NULL ,1 , MAX(%s)+1) AS max_sort FROM %s', $sort_field, $sort_field, $table_name);
            $sort_array = $this->dbca->stmt_query($search_sql);

            //返回排序序号
            return $sort_array[0]->max_sort;

        } catch (Exception $e) {
            error_log($e->getMessage());
            return 0;
        }

    }

    /**
     * 检测变量是否是URL地址
     * @author 刘道健
     * @param string $val URL
     * @return bool
     */
    public function isUrl($val) {
        return preg_match('/^(((ht|f)tp(s?))\:\/\/)?(www.|[a-zA-Z].)[a-zA-Z0-9\-\.]+\.(com|edu|gov|mil|net|org|biz|info|name|museum|us|ca|uk|cn|com.cn)(\:[0-9]+)*(\/($|[a-zA-Z0-9\.\,\;\?\'\\\+&amp;%\$#\=~_\-]+))*$/', $val);
    }

    /**
     * 检测变量是否是邮件地址
     * @author 刘道健
     * @param string $val email
     * @return bool
     */
    public function isEmail($val) {
        return preg_match('/^[\w-]+(\.[\w-]+)*\@[A-Za-z0-9]+((\.|-|_)[A-Za-z0-9]+)*\.[A-Za-z0-9]+$/', $val);
    }


    /**
     * 检测变量是否是密码
     * 密码只能是6-30位英文、数字及“_”、“-”组成
     * @author 刘道健
     * @param string $val 密码
     * @return bool
     */
    public function isPwd($val) {
        return preg_match('/^[\w-]{6,30}$/', $val);
    }


    /**
     * 检测变量是否是邮政编码
     * 邮政编码必须是6位的数字
     * @author 刘道健
     * @param int $val 邮政编码
     * @return bool
     */
    public function isPostalCode($val) {
        return preg_match('/^[\d]{6}$/', $val);
    }


    /**
     * 检测变量是否是手机号码
     * 手机号码必须是11位的数字，第一位数字必须为1，第二数字必须是34568中的任意一个
     * @param string $val 手机号码
     * @return bool
     * mod by allen.qiang 20141022 手机号19899882211创建退货单报错
     */
    public function isMobile($val) {
        //mod by allen.qiang 20141022 手机号19899882211创建退货单报错--start
        //return preg_match('/^1[34568]+\d{9}$/', $val);
        return preg_match('/^1[1234567890]+\d{9}$/', $val);
        //mod by allen.qiang 20141022 手机号19899882211创建退货单报错--end
    }


    /**
     * 检测变量是否是座机号码
     * 3-4位区号，7-8位直播号码，1－4位分机号
     * @param string $val 座机号码
     * @return bool
     */
    public function isPhone($val) {
        return preg_match('/^(0[0-9]{2,3}-)?([2-9][0-9]{6,7})+(-[0-9]{1,4})?$/', $val);
    }


    /**
     * 检测变量是否是金额
     * @param string $val 金额
     * @param int $type 默认为空【1.大于0的金额 2.大于等于的金额 3.小于0的金额 4.小于等于0的金额】
     * @return bool
     */
    public function isMoney( $val, $type = null ) {

        if (!preg_match('/^\d*(\.\d{1,2})?$/', $val))
            return false;

        if ($type == 1 && $val <= 0)
            return false;
        else if ($type == 2 && $val < 0)
            return false;
        else if ($type == 3 && $val >= 0)
            return false;
        else if ($type == 4 && $val > 0)
            return false;

        return true;

    }

    /**
     * 处理数据
     *
     * @param string $str
     * @return string
     */
    public function getVal($val) {

        return $this->convertVar($val);

    }

    /**
     * 检测变量是否是日期或日期+时间
     * @param $val
     * @return bool
     */
    public function isDate( $val ) {
        return preg_match('/^\d{4}-\d{2}-\d{2}|\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}$/s', $val);
    }


    /**
     * 处理数据
     * @param string $str
     * @return string
     */
    public function convertVar($val) {

        if (!isset($val) || empty($val))
            return null;
        return htmlspecialchars(trim($val));

    }

    /**
     * 处理扫描数据
     * @param string $str
     * @return string
     */
    public function scanVal( $val ){

        $sonVal = substr( $val , 0 , 1 );

        if( $sonVal == 0 ){
            return substr( $val , 1);
        }else{
            return $val;
        }

    }


    /**
     * 检查是否是整数
     * @param string $val 值
     * @param int $type 默认为空【1.大于0的整数 2.大于等于的整数 3.小于0的整数 4.小于等于0的整数】
     * @return bool
     */
    public function isInteger( $val, $type = null ) {

        if (ceil($val) != $val)
            return false;

        if ($type == 1 && $val <= 0)
            return false;
        else if ($type == 2 && $val < 0)
            return false;
        else if ($type == 3 && $val >= 0)
            return false;
        else if ($type == 4 && $val > 0)
            return false;

        return true;

    }


    /**
     * 分页程序
     * @author 刘道健
     * @param int $pageIndex 当前页码
     * @param int $count 总数量
     * @param int $displayCount 每页显示数量
     * @param string $link 分页链接，链接里的页码部分用%d代替，在本方法中会用sprintf函数替换%d为页码。例：/shop/member_order.php?pageIndex=%d
     * @param object $smarty smarty对象实例
     * @param string $tpl 分页tpl
     * @return null：总页小于等于1，不用分页
     * 		   $pageHtml：分页HTML代码，在前台直接使用就可以
     */
    public function shopPage($pageIndex, $count, $displayCount, $link, &$smarty, $tpl = 'page.tpl') {

        $pageCount = ceil($count / $displayCount);
        if ($pageCount == 1)
            return null;

        $pageLinks = array();
        if ($pageIndex > 1) {
            $pageLinks['goto_previous_page_link'] = sprintf($link, $pageIndex - 1);
        }
        if ($pageIndex < $pageCount) {
            $pageLinks['goto_next_page_link'] = sprintf($link, $pageIndex + 1);
        }
        $i = 1;
        while ($i <= $pageCount) {
            $pageLinks['link'][] = array('href' => sprintf($link, $i), 'text'=> $i);
            if ($pageIndex - 3 > $i) {
                $pageLinks['link'][] = array('href' => '', 'text'=> '...');
                $i = $pageIndex - 3;
            } else if ($i < $pageCount && $pageIndex + 3 < $i && $pageCount - 1 > $i) {
                $pageLinks['link'][] = array('href'=>'', 'text'=>'...');
                $i = $pageCount - 1;
            }
            $i++;
        }
        $pageLinks['pageIndex'] = $pageIndex;
        $pageLinks['total'] = $count;
        $pageLinks['pageCount'] = $pageCount;
        $smarty->assign_by_ref('pageLinks', $pageLinks);
        $pageHtml = $smarty->fetch($tpl);
        return $pageHtml;

    }

    /**
     * 公共的查询列表页数据
     * @param array  $arg_array                          查询参数数组
     * $arg_array = array(
    'sortname' => string, 排序字段
    'sortorder' => string, 排序方式
    'page' => int, 分页页数
    'rp' => int, 分页页数
     * )
     * @param string $table_name                         表名
     * @param array  $extend_array
     * $extend_array = array(
    'field' => 1|2|3   1、普通值模糊查询 2、加密值模糊查询 3、in查询
     * )
     * @return null
     */
    public function search( &$arg_array, $table_name, $extend_array = null ) {

        //sql字符串
        $sql = '';

        //参数类型字符串
        $params_type = '';

        //参数值数组
        $params_array = array();

        if (isset($arg_array) && is_array($arg_array)) {

            foreach($arg_array as $key => &$value) {

                if (in_array($key, array('sortname', 'sortorder', 'page', 'rp', 'extend')))
                    continue;

                if(gettype ( $value ) == 'integer'){
                    $bindType = 'i';
                } elseif(gettype ( $value ) == 'double'){
                    $bindType = 'd';
                } elseif (gettype ($value ) == 'string'){
                    $bindType = 's';
                } else{
                    $bindType = 's';
                }

                if (isset($extend_array[$key])) {

                    if ($extend_array[$key] == 1) {

                        $sql .= sprintf(' AND %s LIKE ?', $key);
                        $params_type .= $bindType;
                        $params_array[] = '%' . $value . '%';

                    } else if ($extend_array[$key] == 2) {

                        $sql .= sprintf(' AND %s LIKE ?', $key);
                        $params_type .= $bindType;
                        $params_array[] = '%' . encrypt_paramD($value) . '%';

                    } else if ($extend_array[$key] == 3) {

                        $sql .= sprintf(' AND %s IN (%s)', $key, $value);

                    }

                } else {

                    $sql .= sprintf(' AND %s = ?', $key);
                    $params_type .= $bindType;
                    $params_array[] = $value;

                }


            }

        }

        if (isset($arg_array['extend']) && !empty($arg_array['extend'])) {
            $sql .= $arg_array['extend'];
        }

        if ($sql) {
            $sql = ' WHERE ' . substr($sql, 4);
        }

        $sql = $table_name . $sql;


        try {

            if (isset($arg_array['rp']) && $arg_array['rp'] > 0) {

                //统计分类数量
                $search_sql = 'SELECT COUNT(*) AS item_count FROM ' . $sql;
                $count_array = &$this->dbca->stmt_query($search_sql, $params_type, $params_array);
                $item_count = $count_array[0]->item_count;
                if ($item_count == 0) {
                    $arg_array['count'] = 0;
                    return null;
                }

                $arg_array['count'] = $item_count;

                //排序
                if (isset($arg_array['sortname']) && !empty($arg_array['sortname']))
                    $sql .= sprintf(' ORDER BY %s %s', $arg_array['sortname'], $arg_array['sortorder']);

                //分页
                if (!isset($arg_array['page']) || !is_numeric($arg_array['page']) || $arg_array['page'] <= 0)
                    $arg_array['page'] = 1;

                $sql .= sprintf(' LIMIT %d, %d', ($arg_array['page'] - 1) * $arg_array['rp'], $arg_array['rp']);

            } else {

                //排序
                if (isset($arg_array['sortname']) && !empty($arg_array['sortname']))
                    $sql .= sprintf(' ORDER BY %s %s', $arg_array['sortname'], $arg_array['sortorder']);

            }

            //查询分类信息
            $search_sql = 'SELECT * FROM ' . $sql;
            $item_array = &$this->dbca->stmt_query($search_sql, $params_type, $params_array);

            return $item_array;

        } catch (Exception $e) {

            error_log($e->getMessage());
            return null;

        }

    }


}